ICTSC2018 本戦 問題解説: スーパーファミコンの後継機, その名はN64!

問題文

あなたはとある会社のNOCに所属しています。
ある日、どこぞのセミナーから帰ってきた無能な上司に「知ってる? IPv4アドレスって数が少なくて枯渇してるんだよ? これからはIPv6の時代! 社内LANではIPv4禁止ね。 明日までによろしく!」と言い渡された。

さて、やれと言われたらやらなくてはならない。
しかし、クライアントがIPv6アドレスしか持たなくなると、IPv4アドレスしか持ってないWebサイトにアクセスできなくなってしまう。
どうやら、NAT64/DNS64という技術を使うといいらしい。

NAT64/DNS64を検証せよ。

情報

C

IPアドレス: 192.168.3.1
ユーザー: admin
パスワード: admin

R1

IPv6アドレス: fd00:31::71
ユーザー: admin
パスワード: admin
備考: Clientを踏み台にする必要あり

問題のスタート状態

  • C,R1にsshできる
  • R1からS1,S2それぞれにIPでpingが通る
  • Cはeth0にIPv4アドレスとeth1にIPv6アドレスを持っている(R1から配布)
  • R1にはunboundとjoolを導入済み

問題のゴール状態

R1でNAT64,DNS64の設定をして、CからS1,S2にドメインでアクセスできる
R1のDNS64はR2のDNSを参照する

curl server1.local
curl server2.local

構成

トラブル概要

この問題は要約すると「NAT64/DNS64を構築してIPv6クライアントからIPv4サーバーにドメインでアクセスせよ」となります。
構築と言いましたが、問題の開始時点でR1にJool(NAT64用)とunbound(DNS64)の導入とルーティングが済ませてあるので、実際にはR1にJoolとunboundのコンフィグを書くだけというシンプルな構成になっています。

解説

NAT64/DNS64とはIPv6移行技術の1つで、今回の環境のような「クライアントにはIPv6アドレスのみ割り振られているがIPv4アドレスのみで動作しているサービスにアクセスしたい」という場合に利用されます。
以下の図がNAT64/DNS64の概要です。
DNS64はAレコード(IPv4)にプレフィックスを付けてAAAAレコード(IPv6)に変換します。
NAT64はDNS64でプレフィックスを付加されてIPv6になったアドレスを元のIPv4アドレスに変換してアクセスします。

回答例

unboundでのDNS64の設定

6行目でdns64のプレフィックスを設定し、13行目で上流のDNSにR2を指定しています。

server:
  verbosity: 2
  pidfile: "/var/run/unbound.pid"
  use-syslog: yes
  module-config: "dns64 iterator"
  dns64-prefix: 64:ff9b::/96
  dns64-synthall: no
  interface: ::0
  access-control: ::0/0 allow

forward-zone:
  name: "."
  forward-addr: 192.168.3.131

JoolでのNAT64の設定

sudo modprobe jool
sudo jool instance add default --netfilter -6 64:ff9b::/96

採点基準

以下を基準として採点を行いました。

  • NAT64/DNS64の設定が正しく行われている
  • R1のunboundがR2に問い合わせに行くようになっている

まとめ

この問題を解くポイントはNAT64/DNS64の概要を把握することとJoolの公式ドキュメントを読むことです。私も作問時にJoolの使い方を調べましたが、記事の多くは内容が古く最新のJoolでは動作しない設定が載っていまいた。提出された回答の中にはそういった古い情報に惑わされたであろうものがいくつか有りました。
結果は満点が5チームと部分点が1チームで、1/3のチームが満点を取得していました。

余談ですが、懇親会で参加者の方々から「IPv6が嫌いになった」という悲しい声が聞こえましたが、私も作問時にIPv6のDNS周りのバグを踏みまくり少し嫌いになりました。

IPv6流行るといいですね?